/****************************************************************************************
*            . .. .                                                                     *
*                    ...                                                                *
*                       .":                                                             *
*   .                      u                                                            *
* ..     .:uxkkOkkx=.      "k'                                                          *
*.     "k00O0ko==uk00x'     OO.                       IBE-CAE                           *
*'   .xK0O00: 'xx" x0Ku    .O0:     Copyright (C) by Internet Based Engineering         *
*   .O0OO00= oKOk:"O0O'    :00=                 All rights reserved.                    *
*.  =0OOO00" =OOO0Oo'     =0OO:                      www.ibe.cn                         *
*.  u0OOOO0O'          .o00OOO.                                                         *
* . :KOOOOO00xu=:::=uok00OOOO"                                                          *
*   .x00OOOOOO0000000OOOOOOx.                                                           *
*    .u00OOOOOOOOOOOOOOOOO=                                                             *
*      .ukOOOOOOOOOOOOku'                                                               *
*          .'::==::'.                                                                   *
****************************************************************************************/

#ifndef IBE_COMMON_H_
#define IBE_COMMON_H_

#include <string>
#include <vector>

#include "IBE_Common_Export.h"

namespace ibe_common
{
    /**
    * @class IBE_Common
    * @brief 一些常用的方法
    * @author liupeng
    */
    class IBE_COMMON_EXPORT IBE_Common
    {
    public:
        /**
        * @brief 去除字符串前后空格
        *
        * @param str 要处理的字符串
        * @return 返回处理后的字符串
        */
        static std::string StringTrimmed( const char* str );
        /**
        * @brief 根据分隔符分割字符串
        *
        * @param str 要处理的字符串
        * @param sep 分隔符
        * @return 返回处理后的字符串容器
        */
        static std::vector<std::string> StringSplit( const char* str, const char* sep );

        /**
         * @brief 将文件复制到指定目录下
         *   
         * @param source_dir 原始文件地址
         * @param destination_dir 输出文件地址
         * @return 0-失败，1-成功
         */
        static int CopyFileToPath( const char* source_dir, const char* destination_dir );

        /**
         * @brief 相对路径转绝对路径
         *   
         * @param path 相对路径
         * @return 绝对路径
         */
        static std::string AbsolutePath( const char* path );

        /**
         * @brief 判断字符串中是否有中文
         *   
         * @param str 要判断的字符串
         * @return 0-无中文，1-有中文
         */
        static int HasChineseString( const char *str );
        
        /**
         * @brief 场数据分量名
         *   
         * @param componentSize 分量数
         * @return 分量名容器
         */
        static std::vector<std::string> ComponentNamesOfVector( const int componentSize );
        /**
         * @brief 场数据分量名，以“:”分隔
         *   
         * @param componentSize 分量数
         * @return 分量名
         */
        static std::string ComponentNamesOfString( const int componentSize );

        /**
        * @brief 获取单元对应的子单元类型（都是VTK单元类型）
        *
        * @param cellType vtk单元类型，VTK_VERTEX、VTK_LINE等
        * @param edgeId edge在单元中的索引，索引从0开始，部分cellType会有多种子单元类型
        * @param faceId face在单元中的索引，索引从0开始，部分cellType会有多种子单元类型
        * @return 长度为2，第一个为edge子单元类型，第二个为face的子单元类型
        */
        static std::vector<int> GetSubCellTypeByCellTypeOfVtk(
            const int &cellType, const int &edgeId = 0, const int &faceId = 0 );

        /**
         * @brief 替换字符串中指定字符
         *   
         * @param str 要替换的字符串
         * @param before 替换前的字符
         * @param after 替换后的字符
         * @return 替换后的字符串
         */
        static std::string ReplaceCharOfString( const std::string str, char before, char after  );

    protected:
        explicit IBE_Common();
        ~IBE_Common();

    private:
        IBE_Common( const IBE_Common& ) = delete;
        IBE_Common& operator=( const IBE_Common& ) = delete;
    };
} // namespace ibe_common

#endif // IBE_COMMON_H_